/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ManagedBeans;

import ComponenteDatos.EncomiendaFacadeLocal;
import ComponenteDatos.EncomiendadetalleFacade;
import ComponenteDatos.EncomiendadetalleFacadeLocal;
import ComponenteDatos.IngresosFacadeLocal;
import ComponenteEntidad.*;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.ExceptionConverter;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.org.apache.xml.internal.utils.Trie;
import java.awt.geom.RoundRectangle2D;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.event.CellEditEvent;

/**
 *
 * @author Esmeralda
 */
@ManagedBean
@SessionScoped
public class ManagedBeanEncomiendaDetalle implements Serializable {

    @EJB
    private EncomiendadetalleFacadeLocal encomiendadetalleFacade;
    @EJB
    private EncomiendaFacadeLocal encomiendaFacade;
    @EJB
    private IngresosFacadeLocal IngresosFacade;
    private Encomiendadetalle objetoEncomiendaDetalle;
    private Encomiendadetalle objetoEncoDetalleCrear;
    private ManagedBeanEncomienda managedBeanEncomien;
    private Tipoencomienda objetoTipoEncomienda;
    private Encomienda objetoEncomienda;
    private List<Encomiendadetalle> listaDetalle;
    private boolean remitente1;
    private boolean destinatario1;
    private double billete;
    private double subtotal;
    private double igv;
    private double vuelto;
    String tipoDocRemi;
    String tipoDocDest;
    private int banderashowdilogprint;
    private int idencomienda;//para llamar al pdf creado con ese id
    private int tipocomprob;//para llamar al pdf creado con ese id
    private String montoDesc;

    public ManagedBeanEncomiendaDetalle() {
        objetoEncomiendaDetalle = new Encomiendadetalle();
        objetoEncoDetalleCrear = new Encomiendadetalle();
        objetoTipoEncomienda = new Tipoencomienda();
        objetoEncomienda = new Encomienda();
        objetoEncoDetalleCrear.setDencAfectoIGV(Boolean.FALSE);
        objetoEncoDetalleCrear.setTipoencomienda(new Tipoencomienda());
        listaDetalle = new LinkedList<Encomiendadetalle>();
        managedBeanEncomien = new ManagedBeanEncomienda();
        objetoEncomienda.setEncPagado(Boolean.FALSE);
        objetoEncomienda.setEncTotal(BigDecimal.ZERO);
        objetoEncomienda.setEncDescuento(BigDecimal.ZERO);
        remitente1 = true;
        destinatario1 = true;
        tipoDocRemi = "Nro. DNI";
        tipoDocDest = "Nro. DNI";
        montoDesc = "Descripcion";
        billete = 0;
        subtotal = 0;
        igv = 0;
        vuelto = 0;
        banderashowdilogprint = 0;
        objetoEncoDetalleCrear.setDencCantidad(1);
        objetoEncoDetalleCrear.setDencPeso("");
        objetoEncoDetalleCrear.setDencDetalle("");
        objetoEncoDetalleCrear.setDencPrecio(BigDecimal.ZERO);
        idencomienda = 0;
        tipocomprob = 0;
    }

    public String reinit() {
        objetoEncoDetalleCrear = new Encomiendadetalle();
        return null;
    }

    public String getMontoDesc() {
        return montoDesc;
    }

    public void setMontoDesc(String montoDesc) {
        this.montoDesc = montoDesc;
    }

    public Encomiendadetalle getObjetoEncomiendaDetalle() {
        return objetoEncomiendaDetalle;
    }

    public void setObjetoEncomiendaDetalle(Encomiendadetalle objetoEncomiendaDetalle) {
        this.objetoEncomiendaDetalle = objetoEncomiendaDetalle;
    }

    public Tipoencomienda getObjetoTipoEncomienda() {
        return objetoTipoEncomienda;
    }

    public void setObjetoTipoEncomienda(Tipoencomienda objetoTipoEncomienda) {
        this.objetoTipoEncomienda = objetoTipoEncomienda;
    }

    public Encomiendadetalle getObjetoEncoDetalleCrear() {
        return objetoEncoDetalleCrear;
    }

    public void setObjetoEncoDetalleCrear(Encomiendadetalle objetoEncoDetalleCrear) {
        this.objetoEncoDetalleCrear = objetoEncoDetalleCrear;
    }

    public List<Encomiendadetalle> getListaDetalle() {
        List<Encomiendadetalle> listaTemporal = new LinkedList<Encomiendadetalle>();
        if (listaDetalle != null) {
            for (int i = listaDetalle.size() - 1; i >= 0; i--) {
                listaTemporal.add(listaDetalle.get(i));
            }
        }
        return listaTemporal;
    }

    public void setListaDetalle(List<Encomiendadetalle> listaDetalle) {
        this.listaDetalle = listaDetalle;
    }

    public double getBillete() {
        return billete;
    }

    public void setBillete(double billete) {
        this.billete = billete;
    }

    public double getSubtotal() {
        return subtotal;
    }

    public void setSubtotal(double subtotal) {
        this.subtotal = subtotal;
    }

    public double getIgv() {
        return igv;
    }

    public void setIgv(double igv) {
        this.igv = igv;
    }

    public double getVuelto() {
        return vuelto;
    }

    public void setVuelto(double vuelto) {
        this.vuelto = vuelto;
    }

    public ManagedBeanEncomienda getManagedBeanEncomien() {
        return managedBeanEncomien;
    }

    public void setManagedBeanEncomien(ManagedBeanEncomienda managedBeanEncomien) {
        this.managedBeanEncomien = managedBeanEncomien;
    }

    public Encomienda getObjetoEncomienda() {
        return objetoEncomienda;
    }

    public void setObjetoEncomienda(Encomienda objetoEncomienda) {
        this.objetoEncomienda = objetoEncomienda;
    }

    public boolean getRemitente1() {
        return remitente1;
    }

    public void setRemitente1(boolean remitente1) {
        this.remitente1 = remitente1;
    }

    public boolean getDestinatario1() {
        return destinatario1;
    }

    public void setDestinatario1(boolean destinatario1) {
        this.destinatario1 = destinatario1;
    }

    public String getTipoDocRemi() {
        return tipoDocRemi;
    }

    public void setTipoDocRemi(String tipoDocRemi) {
        this.tipoDocRemi = tipoDocRemi;
    }

    public String getTipoDocDest() {
        return tipoDocDest;
    }

    public void setTipoDocDest(String tipoDocDest) {
        this.tipoDocDest = tipoDocDest;
    }

    public int getBanderashowdilogprint() {
        return banderashowdilogprint;
    }

    public void setBanderashowdilogprint(int banderashowdilogprint) {
        this.banderashowdilogprint = banderashowdilogprint;
    }

    public int getIdencomienda() {
        return idencomienda;
    }

    public void setIdencomienda(int idencomienda) {
        this.idencomienda = idencomienda;
    }

    public int getTipocomprob() {
        return tipocomprob;
    }

    public void setTipocomprob(int tipocomprob) {
        this.tipocomprob = tipocomprob;
    }

    public void agregandoDetalle(double igvactual, double dscto, String tipocomp) {
        try {
            if (objetoEncomienda.getEncNroDocComp().equals("")) {
                FacesMessage msg = new FacesMessage("Informacion", "Ingrese el Numero de Comprobante");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }

            if (objetoEncoDetalleCrear.getDencCantidad() == null || objetoEncoDetalleCrear.getDencPrecio() == null || objetoEncoDetalleCrear.getDencDetalle().equals("")) {
                FacesMessage msg = new FacesMessage("Informacion", "Ingrese todos los campos requeridos(Cantidad, Precio y Descripcion)");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }
//            objetoDetallecliente.setDcliEstado(true);
//            objetoDetallecliente.setCliente(objetoClienteCrear);

            if (objetoEncoDetalleCrear.getDencCantidad() <= 0 || objetoEncoDetalleCrear.getDencPrecio().doubleValue() <= 0) {
                FacesMessage msg = new FacesMessage("Informacion", "La Cantidad y el Precio debben ser Mayor a CERO (0)");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }
            boolean agregar = true;
            boolean sigiro = false;
            if (listaDetalle != null) {
                for (int i = listaDetalle.size() - 1; i >= 0; i--) {
                    //para giros(para que no agregue mas cosas al haber ingresado ia a la lista un giro)
                    if (listaDetalle.get(i).getTipoencomienda().getEncTipo().equalsIgnoreCase("Giro")) {
                        sigiro = true;
                    }

                    if (listaDetalle.get(i).getDencDetalle().equalsIgnoreCase(objetoEncoDetalleCrear.getDencDetalle())) {
                        agregar = false;
                        break;
                    }
                }
            }

            //para giros(para que no agregue mas cosas al haber ingresado ia a la lista un giro)
            if (sigiro) {
                FacesMessage msg = new FacesMessage("Informacion", "Debe Terminar el Proceso del Giro");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }
            if (!listaDetalle.isEmpty() && objetoEncoDetalleCrear.getTipoencomienda().getEncTipo().equalsIgnoreCase("Giro")) {
                FacesMessage msg = new FacesMessage("Informacion", "No se puede Agregar un Giro a una lista de Encomiendas");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }
            //fin para giro

            if (agregar) {
                if (tipocomp.equalsIgnoreCase("Factura")) {
                    objetoEncoDetalleCrear.setDencAfectoIGV(true);
                } else {
                    objetoEncoDetalleCrear.setDencAfectoIGV(false);
                }
                objetoEncoDetalleCrear.getDencDetalle().trim();
                objetoEncoDetalleCrear.getDencPeso().trim();
                objetoEncoDetalleCrear.setEncomienda(objetoEncomienda);
                listaDetalle.add(objetoEncoDetalleCrear);
                //limpiamos valores
                objetoEncoDetalleCrear = new Encomiendadetalle();
                objetoEncoDetalleCrear.setDencCantidad(1);
                objetoEncoDetalleCrear.setDencPeso("");
                objetoEncoDetalleCrear.setDencDetalle("");
                objetoEncoDetalleCrear.setDencPrecio(BigDecimal.ZERO);
                montoDesc = "Descripcion";

                calcularTotales(igvactual, dscto, tipocomp);
            } else {
                FacesMessage msg = new FacesMessage("Informacion", "Detalle ya esta Agregado");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                calcularTotales(igvactual, dscto, tipocomp);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void calcularTotales(double igvactual, double dscto, String tipocomp) {
        //Valores para la Tabla Totales:
        subtotal = 0;
        double aux = 0;
        double aux2 = 0;
        igv = 0;
        String descgeneral = "";
        String tipoenco = "";
        DecimalFormat df = new DecimalFormat("0.00");
        double total = 0;
        if (listaDetalle != null) {
            for (int i = listaDetalle.size() - 1; i >= 0; i--) {
                aux = Double.parseDouble(listaDetalle.get(i).getDencPrecio().toString()) * Double.parseDouble(listaDetalle.get(i).getDencCantidad().toString());//                
                subtotal = subtotal + aux;
                descgeneral = descgeneral + listaDetalle.get(i).getDencCantidad() + " " + listaDetalle.get(i).getTipoencomienda().getEncTipo() + " " + listaDetalle.get(i).getDencDetalle() + "; ";
                tipoenco = listaDetalle.get(i).getTipoencomienda().getEncTipo();
                if (tipoenco.equalsIgnoreCase("Giro")) {
                    try {
                        aux2 = Double.parseDouble(listaDetalle.get(i).getDencDetalle());
                        listaDetalle.get(i).setDencPrecio(BigDecimal.valueOf(aux2 / 10));
                        listaDetalle.get(i).setDencCantidad(1);
                        total = Math.rint(Double.parseDouble(listaDetalle.get(i).getDencDetalle()) * 100) / 100;//redondear a 2 decimales
                        descgeneral = listaDetalle.get(i).getTipoencomienda().getEncTipo() + " de S/. " + df.format(total);
                    } catch (NumberFormatException e) {
                        FacesMessage msg = new FacesMessage("Informacion", "El Monto debe ser un numero Valido(ejm. 100 -> 150.80 -> etc). No se permiten letras");
                        FacesContext.getCurrentInstance().addMessage(null, msg);
                    } catch (Exception e) {
                    }

                }
            }
            objetoEncomienda.setEncDescripcion(descgeneral);

            if (dscto > subtotal) {
                FacesMessage msg = new FacesMessage("Informacion", "El Descuento debe ser Menor o igual al Monto Total");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                dscto = 0;
            }

            //Si es giro
//            double descto=0;
//            descto=dscto;
            if (tipoenco.equalsIgnoreCase("Giro")) {
                subtotal = aux2 / 10;
                aux = aux2 + aux2 / 10;
//                dscto=aux2 / 10;
//                descto=0;
            }

            if (tipocomp.equalsIgnoreCase("Factura")) {
                igv = igvactual * subtotal;
                // System.out.println("igv");
            }

            subtotal = subtotal - igv;
            aux = subtotal + igv - dscto;//para que al hacer un giro no haga el dscto.

            objetoEncomienda.setEncTotal(BigDecimal.valueOf(aux));
            objetoEncomienda.setEncDescuento(BigDecimal.valueOf(dscto));

            if (billete < aux) {
                FacesMessage msg = new FacesMessage("Informacion", "El Cheque de Pago debe ser mayor o igual que el Monto Total");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                vuelto = 0;
            } else {
                vuelto = billete - aux;
            }
        }
    }

    public void cambiarFactBol(double igvactual, double dscto, String tipocomp) {
        if (tipocomp.equalsIgnoreCase("Boleta")) {
            objetoEncoDetalleCrear.setDencAfectoIGV(false);
        } else if (tipocomp.equalsIgnoreCase("Factura")) {
            objetoEncoDetalleCrear.setDencAfectoIGV(true);
        }
        System.out.println("mmmmmnnnnxxx; " + igvactual + " " + dscto + " " + tipocomp);
        calcularTotales(igvactual, dscto, tipocomp);
    }

    public void eliminarDetalle(double igvactual, double dscto, String tipocomp) {
        try {
            if (listaDetalle != null) {
                for (int i = listaDetalle.size() - 1; i >= 0; i--) {
                    if (listaDetalle.get(i).getDencDetalle().equalsIgnoreCase(objetoEncoDetalleCrear.getDencDetalle())) {
                        listaDetalle.remove(i);
                    }
                }
                calcularTotales(igvactual, dscto, tipocomp);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onCellEdit(CellEditEvent event, double igvactual, double dscto, String tipocomp) {
        calcularTotales(igvactual, dscto, tipocomp);
    }

//    public void mostrarAgenciaEnvio() {
//        objetoEncomienda.setAgencia(objetoEncomienda.getViaje().getAgencia());
//    }
    public void insertar(boolean tipoclienteremit, boolean tipoclientedest, ManagedBeanIniciosesion sesion) {
        try {
            if (listaDetalle.size() > 0) {
                //Si es un giro el estado tendra que ser 3:Enviadas(Por Recoger)
                objetoEncomienda.setEncPagaendest(Boolean.FALSE);
                Boolean giro = false;
                for (int i = listaDetalle.size() - 1; i >= 0; i--) {
                    if (listaDetalle.get(i).getTipoencomienda().getEncTipo().equalsIgnoreCase("Giro")) {
                        giro = true;
                    }
                }
                if (objetoEncomienda.getTipopago().getPagoNombre().equalsIgnoreCase("Credito")) {
                    objetoEncomienda.setEncPagado(Boolean.FALSE);//si es credito el pago siempre sera falso
                    objetoEncomienda.setEncPagaendest(Boolean.FALSE);//el estado pagae en destino es true
                }
                if (giro) {
                    objetoEncomienda.setEncEstado(3);//3:Enviadas(por Recoger); 0:Recogida
                    objetoEncomienda.setEncPagado(Boolean.TRUE);//Ungiro siempre se paga al registrar la encomienda
                    objetoEncomienda.setEncPagaendest(Boolean.FALSE);//el estado pagae en destino es true
                } else {
                    objetoEncomienda.setEncEstado(1);//1:por Enviar; 0:Recogida
                    if (!objetoEncomienda.getEncPagado() && objetoEncomienda.getTipopago().getPagoNombre().equalsIgnoreCase("Contado")) {
                        objetoEncomienda.setEncPagaendest(Boolean.TRUE);//el estado pagae en destino es true
                    }
                }
//                // System.out.println("tipopago: " + objetoEncomienda.getTipopago().getPagoNombre());
//                // System.out.println("pagado: " + objetoEncomienda.getEncPagado());
//                
//                // System.out.println("pagado Dest: " + objetoEncomienda.getEncPagaendest());                

                objetoEncomienda.setEncFecha(new Date());
                objetoEncomienda.setEncomiendadetalleList(listaDetalle);
                //insertamod el responsable de inicio de sesion
                objetoEncomienda.setEmpleado(sesion.getObjetoEmpleado());
                objetoEncomienda.setAgencia(sesion.getObjetoEmpleado().getAgencia());
//                // System.out.println("empleado" + sesion.getObjetoEmpleado().getAgencia());
//                // System.out.println("empleado" + sesion.getObjetoEmpleado());
                encomiendaFacade.create(objetoEncomienda);
                FacesMessage msg = new FacesMessage("Informacion", "Registro de Encomienda Ingresado Correctamente");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                banderashowdilogprint = 1;//para mostrar el show dialog Imprimir; del oncomplete
                idencomienda = objetoEncomienda.getIdEncomienda();

                //Imprimir
                if (objetoEncomienda.getTipocomprobante().getTipocompComprobante().equalsIgnoreCase("boleta")) { //Imprimir BOLETA
                    generar_boletaPDF(tipoclienteremit, tipoclientedest);
                    tipocomprob = 1;//1:por acuerdo para boleta
                } else if (objetoEncomienda.getTipocomprobante().getTipocompComprobante().equalsIgnoreCase("factura")) { //Imprimir factura
                    generar_facturaPDF(tipoclienteremit, tipoclientedest);
                    tipocomprob = 2;//1:por acuerdo para para factura
                }

                //Hacer el Ingreso de Caja x Entrega de Giro
                if (giro) {
                    Ingresos objetoIngresosCrear = new Ingresos();
                    Tipoingreso objetoTipoingreso = new Tipoingreso();
                    Tipocomprobante objetoTipocomprobante = new Tipocomprobante();
                    objetoTipoingreso.setIdTipoIngreso(3);//3->Efectivo
                    objetoTipocomprobante.setIdTipoComprobantePago(objetoEncomienda.getTipocomprobante().getIdTipoComprobantePago());
                    objetoIngresosCrear.setIngEstado(true);
                    objetoIngresosCrear.setIngFecha(new Date());
                    objetoIngresosCrear.setTipocomprobante(objetoTipocomprobante);
                    objetoIngresosCrear.setTipoingreso(objetoTipoingreso);
                    objetoIngresosCrear.setAgencia(sesion.getObjetoEmpleado().getAgencia());
                    objetoIngresosCrear.setEmpleado(sesion.getObjetoEmpleado());
                    objetoIngresosCrear.setIngEstadoIngreso(1);
                    objetoIngresosCrear.setIngAcreedor(sesion.getObjetoEmpleado().getPersona().getPerApellidos() + " " + sesion.getObjetoEmpleado().getPersona().getPerNombres());
                    objetoIngresosCrear.setIngNroDocComp(objetoEncomienda.getEncNroDocComp());
                    objetoIngresosCrear.setIngDetalle("Por Entrada de Giro Nro.Comprobante: " + objetoEncomienda.getEncNroDocComp());
                    objetoIngresosCrear.setIngMonto((objetoEncomienda.getEncTotal().multiply(BigDecimal.TEN)));
                    IngresosFacade.create(objetoIngresosCrear);
                }

                //Limpiamos valores de la encomienda enviada para dejarlo listo para la sgte encomienda
                objetoEncomienda = new Encomienda();
                objetoEncomienda.setCliente(new Cliente());
                objetoEncomienda.setCliente1(new Cliente());

                objetoEncomienda.setEncPagado(Boolean.FALSE);
                objetoEncomienda.setEncTotal(BigDecimal.ZERO);
                objetoEncomienda.setEncDescuento(BigDecimal.ZERO);
                objetoEncomienda.setEncPagaendest(Boolean.FALSE);

                objetoEncoDetalleCrear = new Encomiendadetalle();
                objetoEncoDetalleCrear.setDencCantidad(1);
                objetoEncoDetalleCrear.setDencPeso("");
                objetoEncoDetalleCrear.setDencDetalle("");
                objetoEncoDetalleCrear.setDencPrecio(BigDecimal.ZERO);
                listaDetalle = new LinkedList<Encomiendadetalle>();//limpiamos la lista de encomiendas
                subtotal = 0;
                igv = 0;
                billete = 0;
                vuelto = 0;
                // System.out.println("todo reseteado hasta el billete.!!!");

            } else {
                FacesMessage msg = new FacesMessage("Informacion", "Ingrese por lo menos una Encomienda a Enviar");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void cambiarRemiPetecionRUCDNI() {
        if (remitente1 == true) {
            tipoDocRemi = "Nro. DNI";
        } else {
            tipoDocRemi = "Nro. de RUC";
        }
    }

    public void cambiarDestPetecionRUCDNI() {
        if (destinatario1 == true) {
            tipoDocDest = "Nro. DNI";
        } else {
            tipoDocDest = "Nro. de RUC";
        }
    }

    public String formatearFecha(Date fecha) {
        String fechaformateada = "";
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaformateada = (df.format(fecha));
        return fechaformateada;
    }

    public void cambiarValormostrarprint() {
        banderashowdilogprint = 0;
    }

    public void generar_boletaPDF(boolean tipoclienteremit, boolean tipoclientedest) {
        Rectangle pagesize = new Rectangle(395f, 285f);
        Document document = new Document(pagesize, 10f, 10f, 10f, 10f);
        // System.out.println("boleta");

        ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        FileWriter fichero = null;
        PrintWriter pw = null;
        SimpleDateFormat fecha_boleta = new SimpleDateFormat("dd/MM/yyyy");
        int idEncomienda = objetoEncomienda.getIdEncomienda();
//        int idEncomienda = 1; //Cambiar x el idEncomienda
        String remitente = "";
        if (tipoclienteremit) {//Natural
            remitente = objetoEncomienda.getCliente().getPersona().getPerNombres() + " " + objetoEncomienda.getCliente().getPersona().getPerApellidos();
        } else {//juridico
            remitente = objetoEncomienda.getCliente().getCliRazSoc() + " " + " RUC: " + objetoEncomienda.getCliente().getCliRUC();
        }

        String destinatario = "";
        String dirdestinatario = "";
        dirdestinatario = objetoEncomienda.getAgencia1().getAgenDireccion() + " " + objetoEncomienda.getAgencia1().getCiudad().getCiudCiudad();
        if (tipoclientedest) {//natural
            destinatario = objetoEncomienda.getCliente1().getPersona().getPerNombres() + " " + objetoEncomienda.getCliente1().getPersona().getPerApellidos();
//            dirdestinatario = objetoEncomienda.getCliente1().getPersona().getPerDireccion();
        } else {//juridico
            destinatario = objetoEncomienda.getCliente1().getCliRazSoc() + " RUC: " + objetoEncomienda.getCliente1().getCliRUC();
//            dirdestinatario = objetoEncomienda.getCliente1().getCliDireccionFiscal();
        }

        String fecha = formatearFecha(objetoEncomienda.getEncFecha());
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(extContext.getRealPath("//Encomiendas//boletas//boleta" + idEncomienda + ".pdf")));
            document.addAuthor("Leon Leyva Leyxer Alexander");
            document.addCreationDate();
            document.addCreator("iText library");
            document.addTitle("BOLETO DE VENTA");

            document.open();
            writer.addJavaScript("this.print(true);", false);//Automaticamente abre el cuadro para imprimir
            String cuadrolargo = "                                                        ";
            destinatario = destinatario + cuadrolargo;
            remitente = remitente + cuadrolargo;

            this.absText(remitente.substring(0, 40), 60, 182, writer);
            this.absText(destinatario.substring(0, 40), 70, 166, writer);
            this.absText(fecha, 342, 166, writer);
            this.absText(dirdestinatario, 117, 150, writer);

            double importe = 0, total = 0;
            boolean tipoencgiro = false;
            int renglon = 120;
            DecimalFormat df = new DecimalFormat("0.00");
            String detalle = "";
            for (int i = 0; i < listaDetalle.size(); i++) {
                importe = Double.parseDouble(listaDetalle.get(i).getDencCantidad().toString()) * Double.parseDouble(listaDetalle.get(i).getDencPrecio().toString());
                total = total + importe;
                if (listaDetalle.get(i).getTipoencomienda().getEncTipo().equalsIgnoreCase("Giro")) {
                    tipoencgiro = true;
                    detalle = objetoEncomienda.getEncDescripcion();
                } else {
                    detalle = listaDetalle.get(i).getTipoencomienda().getEncTipo() + " " + listaDetalle.get(i).getDencDetalle();
                }
                this.absText(listaDetalle.get(i).getDencCantidad().toString(), 20, renglon, writer);
                this.absText((detalle + cuadrolargo).substring(0, 50), 50, renglon, writer);
                importe = Math.rint(importe * 100) / 100;//redondear a 2 decimales
                this.absText("" + df.format(importe), 355, renglon, writer);
                renglon = renglon - 15;
            }
            if (tipoencgiro) {
                total = Double.parseDouble("" + objetoEncomienda.getEncTotal());
                tipoencgiro = false;
            }
            total = Math.rint(total * 100) / 100;//redondear a 2 decimales 
            String cad = df.format(total);
            String[] cadena = cad.split("\\,");
            String partentera = cadena[0];
            String pd = cadena[1];
            if (cadena[1].length() == 1) {
                pd = cadena[1] + "0";
            }

            NumerosLetras numerosLetras = new NumerosLetras(new BigInteger(partentera));
            String letras = numerosLetras.getLetras();
            this.absText("Son " + letras + " y " + pd + "/100 Nuevos soles", 40, 77, writer);
            this.absText("S/. " + df.format(total), 355, 77, writer);

            if (objetoEncomienda.getEncPagado() == true) {
                this.absText("Cancelado", 195, 5, writer);
            } else {
                this.absText("Por Pagar", 195, 5, writer);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fichero) {
                    fichero.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        document.close();
    }

    public void generar_facturaPDF(boolean tipoclienteremit, boolean tipoclientedest) {
        // System.out.println("factura");
        Rectangle pagesize = new Rectangle(426f, 544f);
        Document document = new Document(pagesize.rotate(), 10f, 10f, 10f, 10f);
        document.setMargins(3, 3, 3, 3);
        ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        FileWriter fichero = null;
        PrintWriter pw = null;
        SimpleDateFormat fecha_boleta = new SimpleDateFormat("dd/MM/yyyy");
        int idEncomienda = objetoEncomienda.getIdEncomienda();
//        int idEncomienda = 1; //Cambiar x el idEncomienda

        String remitente = "";
        String dirremitente = "";
        String remitenteruc = "-";
        if (tipoclienteremit) {//Natural
            remitente = objetoEncomienda.getCliente().getPersona().getPerNombres() + " " + objetoEncomienda.getCliente().getPersona().getPerApellidos();
            dirremitente = objetoEncomienda.getCliente().getPersona().getPerDireccion();
        } else {//juridico
            remitente = objetoEncomienda.getCliente().getCliRazSoc();
            remitenteruc = objetoEncomienda.getCliente().getCliRUC();
            dirremitente = objetoEncomienda.getCliente().getCliDireccionFiscal();
        }

        String destinatario = "";
        String dirdestinatario = "";
        dirdestinatario = objetoEncomienda.getAgencia1().getAgenDireccion() + " " + objetoEncomienda.getAgencia1().getCiudad().getCiudCiudad();
        if (tipoclientedest) {//natural
            destinatario = objetoEncomienda.getCliente1().getPersona().getPerNombres() + " " + objetoEncomienda.getCliente1().getPersona().getPerApellidos();
//            dirdestinatario = objetoEncomienda.getCliente1().getPersona().getPerDireccion();
        } else {//juridico
            destinatario = objetoEncomienda.getCliente1().getCliRazSoc() + " RUC: " + objetoEncomienda.getCliente1().getCliRUC();
//            dirdestinatario = objetoEncomienda.getCliente1().getCliDireccionFiscal();
        }

        String fecha = formatearFecha(objetoEncomienda.getEncFecha());
        try {

            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(extContext.getRealPath("//Encomiendas//facturas//factura" + idEncomienda + ".pdf")));
            document.addAuthor("Leon Leyva Leyxer Alexander");
            document.addCreationDate();
            document.addCreator("iText library");
            document.addTitle("FACTURA");

            document.open();
            writer.addJavaScript("this.print(true);", false);//Automaticamente abre el cuadro para imprimir
            String cuadrolargo = "                                                        ";
            destinatario = destinatario + cuadrolargo;
            remitente = remitente + cuadrolargo;
            dirremitente = dirremitente + cuadrolargo;
            remitenteruc = remitenteruc + cuadrolargo;

            this.absText(remitente.substring(0, 40), 12, 354, writer);
            this.absText(dirremitente.substring(0, 40), 12, 326, writer);
            this.absText(remitenteruc.substring(0, 40), 18, 296, writer);
            this.absText(fecha, 442, 309, writer);

            this.absText(destinatario.substring(0, 40), 25, 282, writer);
            this.absText(dirdestinatario, 35, 271, writer);

            double importe = 0, total = 0;
            int renglon = 232;
            String detalle = "";
            DecimalFormat df = new DecimalFormat("0.00");
            for (int i = 0; i < listaDetalle.size(); i++) {
                if (listaDetalle.get(i).getTipoencomienda().getEncTipo().equalsIgnoreCase("Giro")) {
                    detalle = objetoEncomienda.getEncDescripcion();
                } else {
                    detalle = listaDetalle.get(i).getTipoencomienda().getEncTipo() + " " + listaDetalle.get(i).getDencDetalle();
                }
                importe = Double.parseDouble(listaDetalle.get(i).getDencCantidad().toString()) * Double.parseDouble(listaDetalle.get(i).getDencPrecio().toString());
                total = total + importe;
                double pu = Double.parseDouble(listaDetalle.get(i).getDencPrecio().toString());
                this.absText(listaDetalle.get(i).getDencCantidad().toString(), 4, renglon, writer);
                this.absText((detalle + cuadrolargo).substring(0, 60), 25, renglon, writer);
                this.absText(df.format(pu), 394, renglon, writer);
                importe = Math.rint(importe * 100) / 100;//redondear a 2 decimales
                this.absText("" + df.format(importe), 452, renglon, writer);
                renglon = renglon - 17;
            }
            total = Math.rint(total * 100) / 100;//redondear a 2 decimales 
            String cad = df.format(total);
            String[] cadena = cad.split("\\,");
            String partentera = cadena[0];
            String pd = cadena[1];
            if (cadena[1].length() == 1) {
                pd = cadena[1] + "0";
            }

            NumerosLetras numerosLetras = new NumerosLetras(new BigInteger(partentera));
            String letras = numerosLetras.getLetras();
            //le cambiamos de nombre a igv1 y subtotal1 para en BD seguir guardando con todos sus decimales
            double subtotal1 = Math.rint(subtotal * 100) / 100;//redondear a 2 decimales
            double igv1 = Math.rint(igv * 100) / 100;//redondear a 2 decimales
            this.absText(letras + " y " + pd + "/100 Nuevos soles", 15, 95, writer);
            this.absText("S/. " + df.format(subtotal1), 452, 96, writer);
            this.absText(objetoEncomienda.getIgv().getIgvNombre(), 409, 80, writer);
            this.absText("S/. " + df.format(igv1), 452, 78, writer);
            total = Math.rint(total * 100) / 100;//redondear a 2 decimales 
            this.absText("S/. " + df.format(total), 452, 56, writer);
            //estas cantidaddes son o deben ser iguales : df.format(total)=objetoEncomienda.getEncTotal()

            if (objetoEncomienda.getEncPagado() == true) {
                this.absText("Cancelado", 253, 71, writer);
            } else {
                this.absText("Por Pagar", 253, 71, writer);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fichero) {
                    fichero.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        document.close();
    }

    private static void absText(String text, int x, int y, PdfWriter writer) {
        try {
            PdfContentByte cb = writer.getDirectContent();
            BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            cb.saveState();
            cb.beginText();
            cb.moveText(x, y);
            cb.setFontAndSize(bf, 10);
            cb.showText(text);
            cb.endText();
            cb.restoreState();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void calcularPrecioGiro(String tipoencom) {
        double aux = 0.0;
        try {
            if (objetoEncoDetalleCrear.getTipoencomienda().getEncTipo().equalsIgnoreCase("Giro")) {
                aux = Double.parseDouble(objetoEncoDetalleCrear.getDencDetalle());
                if (aux < 50) {
                    aux = 50.0;
                    objetoEncoDetalleCrear.setDencPrecio(BigDecimal.valueOf(aux / 10));
                } else {
                    objetoEncoDetalleCrear.setDencPrecio(BigDecimal.valueOf(aux / 10));
                }
            } else {
                objetoEncoDetalleCrear.setDencPrecio(BigDecimal.ZERO);
            }
        } catch (NumberFormatException e) {
            FacesMessage msg = new FacesMessage("Informacion", "El Monto a Depositar debe ser un numero Valido(ejm. 100 -> 150.80 -> etc). No se permiten letras");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (Exception e) {
        }
    }

    public void cambiaraMonto() {
        // System.out.println("chvr-.");
        if (objetoEncoDetalleCrear.getTipoencomienda().getEncTipo().equalsIgnoreCase("Giro")) {
            montoDesc = "Monto a Depositar";
        } else {
            montoDesc = "Descripcion";
        }
    }
}